package si.unimb.src.wifisms.control.threads;

import si.unimb.src.wifisms.control.BatchSender;

/**
 * 
 * @author Ales
 * 
 * Abstraktni nadrazred, ki se uporablja zaradi generalizacije dela z nitmi.
 * Vgrajen ima tudi mehanizem za obvescanje parenta.
 *
 */
public abstract class AbstractRunnable implements Runnable {

	protected BatchSender parent;
	private long startTime;
	
	/**
	 * 
	 * Konstruktor za razred
	 * 
	 * @param parent BatchSender, ki bo dobival obvestila o napredku
	 */
	public AbstractRunnable(BatchSender parent) {
	
		this.parent = parent;
		this.startTime = System.currentTimeMillis();
		
	}
	
	/**
	 * 
	 * Uporabljen vzorec sablonska metoda.
	 * 
	 */
	@Override
	public void run() {
		
		mainAction();
		notifyParent();

	}
	
	/**
	 * 
	 * Obvescanje BatchSenderja
	 * 
	 */
	protected void notifyParent() {
		
		parent.runnableFinished(this);
		
	}
	
	/**
	 * 
	 * Abstraktna metoda glavne akcije (definira jo podrazred)
	 * 
	 */
	protected abstract void mainAction();
	
	/**
	 * 
	 * Metoda vrne cas kako dolgo objekt ze obstaja.
	 * Uporabno za ugotavljanje casa izvajanja. 
	 * 
	 * @return Trajanje v ms
	 */
	public long getDuration() {
	
		return System.currentTimeMillis() - startTime;
		
	}

}
